очень плохое качество звука, записанного на моем droidx с помощью MediaRecorder, почему? - PullRequest
6 голосов
/ 16 февраля 2011

мой проект требует, чтобы я мог записывать аудио на устройстве Android. Я реализовал решение, используя MediaRecorder (), но записанное аудио в ужасном качестве. Что я делаю неправильно? я должен думать, что это не единственный способ записать аудио пожалуйста, укажите мне правильное направление.

спасибо!

MediaRecorder recorder = new MediaRecorder();
File outputFile = new File(Environment.getExternalStorageDirectory(), "audio.3gp");
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(outputFile.getAbsolutePath());
recorder.prepare();
recorder.start();
// stop
recorder.stop();
recorder.reset(); 
recorder.release();

Ответы [ 5 ]

9 голосов
/ 09 сентября 2011

Попробуйте этот код:

MediaRecorder recorder = new MediaRecorder();
File outputFile = new File(Environment.getExternalStorageDirectory(), "audio.3gp");
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setAudioEncodingBitRate(16);
recorder.setAudioSamplingRate(44100);
recorder.setOutputFile(outputFile.getAbsolutePath());
recorder.prepare();
recorder.start();

Вы собираетесь получить некоторое улучшение, но не ожидайте слишком многого.Вы всегда можете попытаться сохранить несжатый файл, используя класс RehearsalAudioRecord из этого проекта OpenSource

http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/releases/RehearsalAssistant_0_8_2/src/urbanstew/RehearsalAssistant/

Способ реализации этого класса в вашем проекте очень прост.Вам просто нужно заменить ваш MediaRecorder на:

RehearsalAudioRecorder recorder = new RehearsalAudioRecorder(RehearsalAudioRecorder.RECORDING_UNCOMPRESSED, MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT);
recorder.setOutputFile(outputFile.getAbsolutePath());
recorder.prepare();
recorder.start();

Вы сможете записывать файлы WAVE, которые достаточно велики, но если вам нужно качество, это единственный способ.Обратите внимание, что в старых устройствах этот код может

8 голосов
/ 22 марта 2017

Большая проблема, с которой я столкнулся в качестве записи звука, заключалась в том, что я установил слишком низкую битовую скорость на 16. 16 - это значение, которое обычно соответствует битовой глубине, а не битовой скорости.Скорость передачи битов обычно указывается в кбит / с, но MediaRecorder.setAudioEncodingBitRate () принимает бит / с (обратите внимание, нет "k").Попробуйте это:

MediaRecorder recorder = new MediaRecorder();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(...);
recorder.setAudioEncoder(...);

final int bitDepth = 16;
final int sampleRate = 44100;
final int bitRate = sampleRate * bitDepth;

recorder.setAudioEncodingBitRate(bitRate);
recorder.setAudioSamplingRate(sampleRate);

recorder.setOutputFile(...);

recorder.prepare();
recorder.start();
// stop
recorder.stop();
recorder.reset(); 
recorder.release();

Вам нужно будет проверить поддерживаемые форматы мультимедиа , чтобы выяснить правильные соответствия формата (аудиокодер), контейнера (выходной формат), частоты дискретизации (обычноуказывается в кГц, но передается в MediaRecorder.setSamplingRate () как просто Гц), и скорость передачи (обычно указывается в кбит / с).Обратите внимание, что не все форматы в документации имеют указанную скорость передачи данных;использование метода из приведенного выше кода должно дать правильное предположение о правильной скорости передачи в этом случае.

Благодаря @StarPinkER, @PrvN, @arlomedia в этом SO ответе за помощь мнепроясни это.

8 голосов
/ 16 февраля 2011

AMR_NB воняет.

Установите битрейт 16 и частоту дискретизации 44100.

3gpp обычно воняет, попробуйте вместо этого использовать AAC / MPEG_4.

Попробуйте и обновитенам.

2 голосов
/ 24 января 2019

Я использовал следующие настройки и получил очень хорошие аудио результаты.

recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); recorder.setAudioEncodingBitRate(128000); recorder.setAudioSamplingRate(96000);

0 голосов
/ 16 февраля 2011

Не слыша звука, я не могу много рассказать.

Существуют методы объекта MediaRecord, которые можно изменить - Объект Android MediaRecorder *

void     setAudioEncoder(int audio_encoder)
    Sets the audio encoder to be used for recording.
void     setAudioEncodingBitRate(int bitRate)
    Sets the audio encoding bit rate for recording.
void     setAudioSamplingRate(int samplingRate)
    Sets the audio sampling rate for recording.

Попробуйте изменить их и посмотрите, поможет ли какое-либо из них улучшить качество звука.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...